package cn._51doit.day02;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;
import org.apache.flink.streaming.api.functions.source.SourceFunction;

import java.util.Random;

/**
 * 标准键盘布局
 * ┌───┐   ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
 * │Esc│   │ F1│ F2│ F3│ F4│ │ F5│ F6│ F7│ F8│ │ F9│F10│F11│F12│ │P/S│S L│P/B│  ┌┐    ┌┐    ┌┐
 * └───┘   └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘  └┘    └┘    └┘
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
 * │~ `│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ BacSp │ │Ins│Hom│PUp│ │N L│ / │ * │ - │
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
 * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│ | \ │ │Del│End│PDn│ │ 7 │ 8 │ 9 │   │
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │
 * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter  │               │ 4 │ 5 │ 6 │   │
 * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤     ┌───┐     ├───┼───┼───┼───┤
 * │ Shift  │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│  Shift   │     │ ↑ │     │ 1 │ 2 │ 3 │   │
 * ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││
 * │ Ctrl│    │Alt │         Space         │ Alt│    │    │Ctrl│ │ ← │ ↓ │ → │ │   0   │ . │←─┘│
 * └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
 *
 * @create: 2021-10-15 19:49
 * @author: 今晚打脑斧
 * @program: CustomerNonParallelSource
 * @Description:
 *  自定义非并行的Source,即Source的并行度只为1
 *  继承RichSourceFunction抽象类，得到的DataStream为只有一个并行
 **/
public class CustomerNonParallelSource2 {
    public static void main(String[] args) throws Exception{
        Configuration configuration = new Configuration();
        configuration.setInteger("rest.port", 8081);
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(configuration);

        DataStreamSource<Integer> nums = env.addSource(new NonParallelSourceFunc());
        System.out.println("自定义NonParallelSourceFunc得到的DataStream的并行度为: " + nums.getParallelism());

        nums.print();
        env.execute();
    }
    private static class NonParallelSourceFunc extends RichSourceFunction<Integer> {
        /**
         * 先调用open方法
         * @param parameters
         * @throws Exception
         */
        @Override
        public void open(Configuration parameters) throws Exception {
            System.out.println("open方法被调用了.....");
        }

        /**
         *  如果人为将job cancel先调用cancel方法再调用close方法
         *  如果没有将job人为的cancel，任务停掉前一定会调用close方法
         * @throws Exception
         */
        @Override
        public void close() throws Exception {
            System.out.println("close方法被调用了");
        }

        /**
         * run方法task启动后会执行一次
         * 如果run方法一直不退出,就是一个无限的数据流
         * 如果数据读取完了,run方法退出,就是一个有限的数据流,Source退出,job也停止了
         * @param ctx
         * @throws Exception
         */
        @Override
        public void run(SourceContext<Integer> ctx) throws Exception {
            System.out.println("Run方法被调用了");
//            for (int i = 0; i < 100; i++) {
//                //Source产生的数据使用sourceContext将数据输出
//                ctx.collect(i);
//            }
            Random random = new Random();

            while (true) {
                int i = random.nextInt(100);
                ctx.collect(i);
                Thread.sleep(1000);
            }


        }

        /**
         * task cancel会执行一次
         */
        @Override
        public void cancel() {
            System.out.println("cancel方法被调用了++++++++++++");
        }
    }

}
